(function($) {

    var DoAjaxWithSpinnerAndErrorsAndButtonDisabling = function (params) {
        for (var i=0; i < params.buttonsToDisable.length; i++){
            var button = params.buttonsToDisable[i];
            $(button).prop('disabled', true);
        }
        $(params.spinner).show();
        $(params.error).hide();

        var onSuccess = function (response) {
            for (var i=0; i < params.buttonsToDisable.length; i++){
                var button = params.buttonsToDisable[i];
                $(button).prop('disabled', false);
            }
            $(params.spinner).hide();
            if ('onSuccessFunction' in params) {
                params.onSuccessFunction(response);
            }
        };

        var onError = function (error) {
            $(params.error).show();
            for (var i=0; i < params.buttonsToDisable.length; i++){
                var button = params.buttonsToDisable[i];
                $(button).prop('disabled', false);
            }
            $(params.spinner).hide();
        };

        $.ajax({
            'url': params.url,
            'data': params.data,
            'type': 'POST',
            'success': onSuccess,
            'error': onError,
            'timeout': params.timeout
        });
    };

    $.extend(true, window, {
        'Anywhere': {
            'Utils': {
                'DoAjaxWithSpinnerAndErrorsAndButtonDisabling': DoAjaxWithSpinnerAndErrorsAndButtonDisabling
            }
        }
    });
})(jQuery);
